<?php

/**
 * TBlog TBlog博客系统　BY Tmac PHP MVC framework
 * $Author: zhangwentao $  <zwttmac@qq.com>
 * $Id: Base.class.php 1872 2011-04-22 01:37:56Z zhangwentao $
 * http://www.t-mac.org； 
 */
class Base
{

    /**
     * 模板对象
     *
     * @var Template
     */
    protected $tpl;
    /**
     * 当前时间
     *
     * @var int
     */
    protected $now;
    /**
     * DB对象
     *
     * @var objeact
     */
    protected $db = null;
    /**
     * 本次请求是否为POST
     *
     * @var bool
     */
    protected $isPost = false;

    /**
     * 构造函数 初始化
     *
     * @access public
     */
    public function __construct()
    {
        global $TmacConfig;
        $options = array(
            'template_dir' => APP_ROOT . $TmacConfig['Template']['template'], //设置系统模板文件的存放目录
            'cache_dir' => VAR_ROOT . $TmacConfig['Template']['cache_dir'], //指定缓存文件存放目录
            'auto_update' => $TmacConfig['Template']['auto_update'], //当模板文件有改动时重新生成缓存 [关闭该项会快一些]
            'cache_lifetime' => $TmacConfig['Template']['cache_lifetime'], //缓存生命周期(分钟)，为 0 表示永久 [设置为 0 会快一些]
            'suffix' => $TmacConfig['Template']['suffix'], //模板后缀
            'cache_open' => $TmacConfig['Template']['cache_open']           //是否开启缓存，程序调试时使用
        );
        $this->tpl = Template::getInstance();
        $this->tpl->setOptions($options); //设置模板参数

        $this->isPost = ($_SERVER['REQUEST_METHOD'] === 'POST');
        $this->now = time();

        //设置模板中的全局变量
        //前台模板目录
        $this->assign('BASE_V', 'theme/' . $TmacConfig['Template']['template_dir'] . '/');
        //后台模板目录
        $this->assign('BASE_AV', 'theme/' . $TmacConfig['Template']['template_admin_dir'] . '/');
    }

    /**
     * 连接数据库
     *
     * @access public
     * @final
     */
    public final function connect()
    {
        $this->db = Tmac::getDB($GLOBALS['TmacConfig']['Common']['Database']);
    }

    /**
     * 设置模板变量
     *
     * @param string $key   模板页面变量
     * @param mixed $value  对应程序中的变量
     * @access public
     * @return void
     */
    public final function assign()
    {
        $key = @func_get_arg(0);
        $value = @func_get_arg(1);
        if (is_array($key)) {
            $this->tpl->assignByArray($key);
        } else {
            $this->tpl->assign($key, $value);
        }
        return $this;
    }

    /**
     * 获取模板的值
     *
     * @param string $key
     * @return mixed
     */
    public final function value($key)
    {
        return $this->tpl->getValue($key);
    }

    /**
     * 显示前台模板
     *
     * @param string $tpl  模板文件名 为空时是 CONTROLLER_ACTION
     * @access public
     * @return void
     */
    public final function V($tpl = null)
    {
        global $TmacConfig;
        $tpl = $TmacConfig['Template']['template_dir'] . DIRECTORY_SEPARATOR . $tpl;
        Tmac::view($tpl);
    }

    /**
     * 显示后台模板
     *
     * @param string $tpl  模板文件名 为空时是 CONTROLLER_ACTION
     * @access public
     * @return void
     */
    public final function AV($tpl = null)
    {
        global $TmacConfig;
        $tpl = $TmacConfig['Template']['template_admin_dir'] . DIRECTORY_SEPARATOR . $tpl;
        Tmac::view($tpl);
    }

    /**
     * 获取Model对象
     *
     * @param string $model
     * @param string $ext
     * @return object
     */
    public final function M($model, $ext = '.class.php')
    {
        return Tmac::model($model, $ext);
    }

    /**
     * 输出一个Debug变量信息
     *
     * @global array $TmacConfig
     * @param string $key
     * @param mixed $value
     */
    public final function D($key, $value)
    {
        global $TmacConfig;
        if ($TmacConfig['Common']['debug']) {
            $debug = Debug::getInstance();
            $debug->setVar($key, $value);
        }
    }

    /**
     * 载入插件
     *
     * @param string $plugin   插件名 插件类名必须与文件名一致 "."作为目录分隔符
     * @param array $param     插件参数
     * @param string $ext      插件后缀名
     * @return object
     * @access public
     */
    public final function P($plugin, $param = array(), $ext = '.class.php')
    {
        return Tmac::plugin($plugin, $param, $ext);
    }

    /**
     * 转义数据 htmlspecialchars效果
     * @param mixed $data 要转义的数据
     * @return mixed
     */
    public final function H($data)
    {
        return is_array($data) ? array_map(array(__CLASS__, 'H'), $data) : htmlspecialchars($data, ENT_QUOTES);
    }

    /**
     * 反转义数据 htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符。
     * @param mixed $data 要转义的数据
     * @return mixed
     */
    public final function HD($data)
    {
        return is_array($data) ? array_map(array(__CLASS__, 'HD'), $data) : htmlspecialchars_decode($data, ENT_QUOTES);
    }

    /**
     * JS跳转 不受header限制
     *
     * @param string $url      跳转到的URL
     * @param string $errStr   alert提示信息
     */
    public final function alert($url = 'BACK', $errStr = 'NOERR', $parent = false)
    {
        $first = '<script type="text/javascript">';
        $center = '';
        $last = '</script>';
        ($errStr == 'NOERR') ? ($center = '') : ($center = 'alert("' . $errStr . '");');
        ($url == 'BACK') ? ($center .= 'window.history.go(-1);') : ($center .= ( $parent == true ? 'parent.' : '') . 'location.href="' . $url . '";');
        echo $first, $center, $last;
        exit ();
    }

    /**
     * 页面跳转 不受header限制
     *
     * @param string $msg      跳转时提示的文字
     * @param string $url      跳转到的URL（默认是返回上一级）
     * @param string $time     跳转时等待时间
     */
    public final function redirect($msg, $url = 'javascript:history.go(-1);', $time = '2')
    {
        $this->assign('msg', $msg);
        $this->assign('url', $url);
        $this->assign('time', $time);
        $this->AV('redirect');
    }

    /**
     * 取get post参数
     * @param <type> $key
     * @return <type>
     */
    public final function getParam($key)
    {
        if (isset($_GET[$key])) {
            return $_GET[$key];
        } elseif (isset($_POST[$key])) {
            return $_POST[$key];
        } else {
            return '';
        }
    }

}

?>